package ar.com.caeycae.dataentry;

import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;

import ar.com.caeycae.data.MovimientoSube;

public class SubeLoader {

	private static final String SEXO_MASCULINO = "M";
	private static final long ESPERA_JS = 1000;
	private HtmlUnitDriver driver = new HtmlUnitDriver();
	private DateFormat formatter = new SimpleDateFormat("MM/dd/yy"); // TODO

	public List<MovimientoSube> obtenerMovimientosSubes(Date fecha, String dni, String clave, String sexo) throws IOException{
		driver.get("https://www.sube.gob.ar/login.aspx");
		// PRIMER REQUEST
		//setValue("ctl00_ctl00_cph01_cph02_01_txtDocumento", dni);
		//setValue("ctl00_ctl00_cph01_cph02_01_txtclave", clave);
		driver.findElement(By.id("ctl00_ctl00_cph01_cph02_01_txtDocumento")).sendKeys(dni);
		driver.findElement(By.id("ctl00_ctl00_cph01_cph02_01_txtclave")).sendKeys(clave);
		driver.findElement(By.id("ctl00_ctl00_cph01_cph02_01_cmdConsultar")).click();
		// SEGUNDO REQUEST
		if(getElementoById("ctl00_ctl00_cph01_cph02_01_RBLSexo_0") != null)
		{
			if(SEXO_MASCULINO.equalsIgnoreCase(sexo))
				driver.findElement(By.id("ctl00_ctl00_cph01_cph02_01_RBLSexo_0")).click();
			else
				driver.findElement(By.id("ctl00_ctl00_cph01_cph02_01_RBLSexo_1")).click();
			driver.findElement(By.id("ctl00_ctl00_cph01_cph02_01_txtclave")).sendKeys(clave);
			driver.findElement(By.id("ctl00_ctl00_cph01_cph02_01_cmdConsultar")).click();
		}
		driver.findElement(By.id("ctl00_ContentContenido_SelectorTarjetasAcciones1_cmdContinuar")).click();
		// COMIENZO A LEVANTAR PAGINAS
		
		System.out.println("P1");
		List<MovimientoSube> movimientos = new ArrayList<MovimientoSube>();
		List<MovimientoSube> movimientosPagina = obtenerMovimientosSubesDePagina(driver);
		movimientos.addAll(movimientosPagina);
		
		driver.setJavascriptEnabled(true);
		driver.get(driver.getCurrentUrl());
		
		try {
			Thread.sleep(ESPERA_JS);
		} catch (InterruptedException e) {
		}
		
		
		int page = 2;
		WebElement pagination = getElementoByClass("pagination");
		boolean hayPaginas = pagination != null;
		while(hayPaginas)
		{
			System.out.println("P"+page);
			WebElement we = dameLinkDePagina(pagination, page); //pagination.findElement(By.linkText(Integer.toString(page)));
			hayPaginas = we != null;
			if(hayPaginas)
			{
				we.click();
				try {
					Thread.sleep(ESPERA_JS);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				pagination = getElementoByClass("pagination");
				
				movimientosPagina = obtenerMovimientosSubesDePagina(driver);
				movimientos.addAll(movimientosPagina);
			}
			page++;
		}
		return movimientos; 
	}
	
	private WebElement dameLinkDePagina(WebElement pagination, int i) {
		List<WebElement> links = pagination.findElements(By.tagName("a"));
		for (WebElement webElement : links) {
			if(webElement.getText().equalsIgnoreCase(Integer.toString(i)))
				return webElement;
		}
		if("...".equalsIgnoreCase(links.get(links.size()-1).getText()))
				return links.get(links.size()-1);
		return null;
	}

	private WebElement getElementoById(String id) {
		try {
			return driver.findElement(By.id(id));
		} catch (NoSuchElementException e) {}
		return null;
	}
	
	private WebElement getElementoByClass(String clazz) {
		try {
			return driver.findElement(By.className(clazz));
		} catch (NoSuchElementException e) {}
		return null;
	}

	private List<MovimientoSube> obtenerMovimientosSubesDePagina(WebDriver driver) {
		List<MovimientoSube> list = new ArrayList<MovimientoSube>();
		System.out.println(driver.getPageSource());
		List<WebElement> rows = driver.findElement(By.id("ctl00_ContentContenido_gridViajes")).findElements(By.tagName("tr"));
		for (WebElement row : rows) {
			if(row != null && row.getAttribute("class") != null && !row.getAttribute("class").contains("pagination") &&
					!row.getAttribute("class").contains("tableheader")	)
			{
				MovimientoSube movimientoSube = new MovimientoSube();
				int i=0;
				List<WebElement> cols = row.findElements(By.tagName("td"));
				
				Date date = null;
				try {
					date = formatter.parse(cols.get(i++).getText());
				} catch (ParseException e) {}
				
				String tipo = cols.get(i++).getText();
				String medio = cols.get(i++).getText();
				String desde = cols.get(i++).getText();
				Float valor = Float.valueOf(cols.get(i++).getText().replace("$", "").trim());
				String id = ""; // TODO
				
				movimientoSube.setFecha(date);
				movimientoSube.setTipo(tipo);
				movimientoSube.setMedio(medio);
				movimientoSube.setDesde(desde);
				movimientoSube.setValor(valor);
				movimientoSube.setId(id);
				
				System.out.println(movimientoSube);
				
				list.add(movimientoSube);
			}
		}
		return list;
	}

	public static void main(String[] args) throws IOException {
		/*Scanner in = new Scanner(System.in);
		System.out.print("Ingrese su dni:");
		String dni = in.next();
		System.out.print("Ingrese su pass:");
		String clave = in.next();
		System.out.print("Ingrese su sexo (F o M):");
		String sexo = in.next();
		in.close();*/
		List<MovimientoSube> MovimientosSubes = new SubeLoader().obtenerMovimientosSubes(null, "","","");
		for (MovimientoSube movimientoSube : MovimientosSubes) {
			System.out.println("====>" + movimientoSube);
		}
		persistir(MovimientosSubes);
	}

	private static void persistir(List<MovimientoSube> movimientosSube) {
		// TODO Auto-generated method stub

	}

}
